package com.ys.io.IO流.p4字节输入l流;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class 拷贝文件02 {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        // 拷贝文件 字节输出流可以选择: 重命名, 和选择追加模式还是覆盖模式, false 默认时覆盖,true追加
        try (InputStream in = new FileInputStream("day_22/a.txt"); OutputStream out =new FileOutputStream("day_22/b.txt")) {


            // 定义缓冲区，存储读取的数据
            byte [] data = new byte[1024];
            // 存储每次读取的有效字节长度
            int length = 0;
            /**
             * in.read(data)该方法调用一次就会跟磁盘交互一次，每次从磁盘读取1024byte
             * (length = in.read(data))将读取的数据存储到字节数组data中，并且返回读取的有效字节长度
             * ((length = in.read(data)) !=-1 ) 当length不等于-1继续读取，如果等于-1停止读取
             */
            int count = 0;
            while((length = in.read(data)) !=-1 ){
                // 将读取的数据写入目的磁盘
                // 最后一次读取的有效字节长度不可能也是1024，所以使用三个参数
                out.write(data,0,length);
                count++;

            }
            // 结束时间
            long end = System.currentTimeMillis();
            /**
             *耗时：1
             * 循环次数：5
             * 定义了一个 byte的 [1024 ]的内存空间用来接收 这样可以一次接受1024个byte, 内存的读写速度块,磁盘读写速度慢
             * 之前循环体执行300多万次，现在循环体执行3287次。
             * 内存处理数据快，磁盘处理数据慢，之前一次read()方法读取一个，会造成阻塞所以慢
             */
            System.out.println("耗时："+(end-start));
            System.out.println("循环次数："+count);

        }catch (Exception e){
            System.out.println("拷贝失败");
            e.printStackTrace();
        }
    }
}
